package py.com.alfa.escriba.web.services.impl;

import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.MonedasDAO;
import py.com.alfa.escriba.persistence.dto.MonedasDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.MonedasService;

public class MonedasServiceImpl implements MonedasService{

  private MonedasDAO monedasDAO;

  public void setMonedasDAO(MonedasDAO monedasDAO) {
    this.monedasDAO = monedasDAO;
  }

  @Override
  public List<MonedasDTO> listMonedas(InvocationContext ic) throws ServiceException {
    List<MonedasDTO> monedass =  monedasDAO.listMonedas();

    return monedass;
  }

  @Override
  public MonedasDTO getMonedas(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    MonedasDTO monedas =  monedasDAO.getMonedasById(id);

    if (monedas == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"monedas.notfound", id);

    return monedas;
  }

  @Override
  public void deleteMonedas(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    MonedasDTO monedas =  monedasDAO.getMonedasById(id);

    if(monedas == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"monedas.notfound", id);

    try {
      monedasDAO.deleteMonedas(monedas);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "monedas.constraint.violation", id);
    }

  }

  @Override
  public MonedasDTO updateMonedas(Long id, MonedasDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    MonedasDTO monedas = monedasDAO.getMonedasById(id);

    if (monedas == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"monedas.notfound", id);

    monedas.setCodigo(dto.getCodigo());
    monedas.setDescripcion(dto.getDescripcion());
    monedas.setDecimales(dto.getDecimales());
    monedas.setTrn(dto.getTrn());
    monedas.setIdusuario(dto.getIdusuario());
    monedas.setFechacreacion(dto.getFechacreacion());
    monedas.setIdusuariomodificacion(dto.getIdusuariomodificacion());
    monedas.setFechamodificacion(dto.getFechamodificacion());
 

    Utils.validarDTO(dto);

    monedasDAO.updateMonedas(dto);

    return monedas;
  }

  @Override
  public MonedasDTO createMonedas(MonedasDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {

      Utils.validarDTO(dto);

      monedasDAO.createMonedas(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "monedas.duplicate.key");
    }

    return dto;
  }

}